Apache Flink এ দুটি প্রধান API আছে: DataStream API এবং DataSet API। প্রতিটি API ভিন্ন ভিন্ন কাজের জন্য ব্যবহৃত হয় এবং তাদের আলাদা আলাদা বৈশিষ্ট্য আছে। নিচে এই API দুটি নিয়ে বিস্তারিত আলোচনা করা হলো:
DataStream API মূলত streaming ডেটার জন্য ব্যবহৃত হয়, অর্থাৎ এমন ডেটা যা ধারাবাহিকভাবে নিরবচ্ছিন্নভাবে প্রবাহিত হয় (real-time or unbounded data)।
উদাহরণ:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> stream = env.socketTextStream("localhost", 9999);
DataStream<Tuple2<String, Integer>> wordCounts = stream
.flatMap(new Tokenizer())
.keyBy(0)
.sum(1);
wordCounts.print();
env.execute("WordCount Example");
DataSet API মূলত batch processing ডেটার জন্য ব্যবহৃত হয়, অর্থাৎ একটি নির্দিষ্ট সময়ে শুরু এবং শেষ হয় এমন ডেটা সেটের জন্য। Flink 1.14 থেকে DataSet API কে ধীরে ধীরে বাদ দেয়া হচ্ছে, এবং এর পরিবর্তে Table API এবং DataStream API ব্যাবহার করার পরামর্শ দেয়া হচ্ছে। তবে এখনও এর কিছু ব্যবহার দেখা যায়।
উদাহরণ:
ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment();
DataSet<String> text = env.readTextFile("file:///path/to/data.txt");
DataSet<Tuple2<String, Integer>> counts = text
.flatMap(new Tokenizer())
.groupBy(0)
.sum(1);
counts.print();
বৈশিষ্ট্য | DataStream API | DataSet API |
---|---|---|
ডেটা টাইপ | Unbounded (ধারাবাহিক ডেটা) | Bounded (স্থির ডেটা) |
টাইম হ্যান্ডলিং | Event Time, Processing Time সাপোর্ট | টাইম হ্যান্ডলিং নেই |
প্রসেসিং টাইপ | Real-time এবং Continuous | Batch এবং এককালীন প্রসেসিং |
উইন্ডো অপারেশন | Supported | Supported না |
ইটেরেটিভ প্রসেসিং | সাপোর্ট করে না | সাপোর্ট করে |
DataStream API এবং DataSet API Flink এ আলাদা উদ্দেশ্যে ব্যবহৃত হয়। বর্তমান সময়ে Flink এর নতুন ভার্সনগুলোতে DataSet API কম ব্যবহৃত হয় এবং Table API এবং DataStream API ব্যবহার বেশি করা হয়, কারণ এগুলো স্ট্রিম এবং ব্যাচ প্রসেসিং উভয়ের জন্যই আরও সমর্থনশীল এবং আধুনিক ফিচার প্রদান করে।
Apache Flink এ DataStream এবং DataSet হলো দুটি আলাদা API যা ভিন্ন ভিন্ন ধরণের ডেটা প্রসেসিংয়ের জন্য ব্যবহৃত হয়। এদের মধ্যে প্রধান পার্থক্যগুলো নিচে দেওয়া হলো:
তাহলে, স্ট্রিম ডেটা প্রসেস করতে হলে DataStream API এবং ব্যাচ ডেটা প্রসেস করতে হলে DataSet API বেছে নেওয়াই সবচেয়ে ভালো।
Apache Flink হল একটি distributed stream processing ফ্রেমওয়ার্ক, যা real-time এবং batch data processing দুটোই করতে পারে। এটি high-throughput এবং low-latency ডেটা প্রসেসিং এর জন্য ব্যবহৃত হয়। Flink এর মাধ্যমে আপনি বিশাল আকারের ডেটা সেট বা স্ট্রিম থেকে ইনসাইট পেতে পারেন। Flink এর দুটি প্রাথমিক প্রসেসিং প্যারাডাইম রয়েছে:
Flink মূলত একটি stream processing engine, যা continuous এবং real-time ডেটা প্রসেসিং এর জন্য ডিজাইন করা হয়েছে। Streaming Data Processing এর কিছু বৈশিষ্ট্য:
Flink batch processing ও সমর্থন করে, যা বিশাল পরিমাণের ডেটা থেকে ইনসাইট পাওয়ার জন্য ব্যবহৃত হয়। যদিও Flink streaming এর জন্য তৈরি, তবে এটি batch ডেটা প্রসেসিং খুব কার্যকরভাবে করতে পারে। Batch Data Processing এর বৈশিষ্ট্যগুলো:
বিষয়বস্তু | Streaming Processing | Batch Processing |
---|---|---|
ডেটা প্রবাহ | Continuous, infinite (অনন্ত) ডেটা প্রবাহ | Finite (সীমাবদ্ধ) ডেটা সেট |
Latency | Low latency, real-time | High latency, পুরো ডেটা প্রসেসিং শেষে আউটপুট প্রদান |
Fault-Tolerance | Built-in, নিরবচ্ছিন্ন পুনরায় শুরু | Retries বা পুনরায় শুরু প্রয়োজন হতে পারে |
Use Case | Real-time analytics, alert systems | Historical data analysis, batch jobs |
Flink এর এই unified architecture (একক স্থাপত্য) স্ট্রিমিং এবং ব্যাচ প্রসেসিং একসাথে ব্যবহারের সুযোগ দেয়, যা Flink কে অত্যন্ত flexible এবং efficient ফ্রেমওয়ার্ক হিসেবে প্রতিষ্ঠিত করেছে।
Flink API-তে তিনটি বেসিক কম্পোনেন্ট আছে: Source, Transformation, এবং Sink। এরা একসাথে ডাটা প্রসেসিং পাইপলাইন তৈরি করে। এই কম্পোনেন্টগুলোকে ব্যাখ্যা করা হলো:
Source হলো সেই কম্পোনেন্ট, যা ডাটা স্ট্রিম বা ডাটা ফাইল থেকে ইনপুট হিসেবে ডাটা গ্রহণ করে। এটি ডাটা স্ট্রিমিং শুরু করার জন্য প্রথম ধাপ। Flink API বিভিন্ন ধরণের ইনপুট সোর্স সাপোর্ট করে, যেমন:
Example:
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
DataStream<String> stream = env.readTextFile("path/to/your/file.txt");
Transformation হলো সেই প্রক্রিয়া, যা ইনপুট সোর্স থেকে পাওয়া ডাটাকে বিভিন্ন ভাবে প্রক্রিয়াজাত করে আউটপুট হিসেবে তৈরি করে। Transformation-এর মাধ্যমে ডাটা ফিল্টার করা, ম্যাপ করা, গ্রুপ করা বা যোগ করা যায়। Flink API বেশ কিছু Transformation প্রদান করে, যেমন:
Example:
DataStream<String> stream = env.readTextFile("path/to/your/file.txt");
DataStream<String> filteredStream = stream
.filter(line -> line.contains("Flink"))
.map(line -> line.toUpperCase());
Sink হলো Flink পাইপলাইনের শেষ কম্পোনেন্ট, যা প্রসেস করা ডাটাকে কোথাও স্টোর বা প্রকাশ করে। Sink কম্পোনেন্ট ডাটাকে বিভিন্ন জায়গায় লেখার জন্য ব্যবহার করা হয়, যেমন:
Example:
filteredStream.writeAsText("path/to/output/file.txt");
Flink API-তে ডাটা স্ট্রিম প্রসেসিং সাধারণত তিনটি ধাপের মাধ্যমে হয়:
এই তিনটি কম্পোনেন্ট ব্যবহার করে একটি সম্পূর্ণ Flink ডাটা স্ট্রিমিং অ্যাপ্লিকেশন তৈরি করা হয়।
Flink DataStream API ব্যবহার করে স্ট্রিম প্রসেসিং করতে পারেন। এটি সাধারণত real-time data প্রসেসিংয়ের জন্য ব্যবহৃত হয়। নিচে একটি উদাহরণ দিয়ে দেখানো হয়েছে যেখানে একটি DataStream থেকে ডেটা পড়ে এবং কিছু প্রসেসিং করে আউটপুট দেওয়া হয়েছে।
এই উদাহরণে, আমরা একটি socket থেকে ডেটা পড়ব এবং প্রতি লাইনের প্রতিটি word এর সংখ্যা গণনা করব।
প্রথমে আপনাকে Maven প্রোজেক্টে Flink এর ডিপেন্ডেন্সি যুক্ত করতে হবে। নিচের কোডটি আপনার pom.xml
ফাইলে যুক্ত করুন:
<dependencies>
<!-- Flink Core Dependency -->
<dependency>
<groupId>org.apache.flink</groupId>
<artifactId>flink-streaming-java_2.11</artifactId>
<version>1.15.0</version> <!-- Flink এর ভার্সন -->
</dependency>
</dependencies>
নিচের উদাহরণে, আমরা Flink এর মাধ্যমে একটি socket থেকে ডেটা পড়ব এবং word count করব। এটি একটি সাধারণ স্ট্রিম প্রসেসিং উদাহরণ।
import org.apache.flink.api.common.functions.FlatMapFunction;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.util.Collector;
public class FlinkWordCount {
public static void main(String[] args) throws Exception {
// Execution Environment তৈরি করুন
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// DataStream তৈরি করে socket থেকে ডেটা পড়ুন (hostname: localhost, port: 9999)
DataStream<String> text = env.socketTextStream("localhost", 9999);
// প্রতিটি লাইনের word গুলোকে আলাদা করে গণনা করুন
DataStream<Tuple2<String, Integer>> wordCounts = text
.flatMap(new Tokenizer())
.keyBy(value -> value.f0)
.sum(1);
// আউটপুট প্রিন্ট করুন
wordCounts.print();
// Execution শুরু করুন
env.execute("Socket WordCount Example");
}
// Tokenizer class - word গুলোকে আলাদা করে এবং তাদের একটি count সহ output দেয়
public static final class Tokenizer implements FlatMapFunction<String, Tuple2<String, Integer>> {
@Override
public void flatMap(String value, Collector<Tuple2<String, Integer>> out) {
// প্রতিটি লাইনের word গুলো স্পেস দিয়ে আলাদা করুন
String[] tokens = value.toLowerCase().split("\\W+");
// প্রতিটি word কে (word, 1) টুপল হিসেবে প্রেরণ করুন
for (String token : tokens) {
if (token.length() > 0) {
out.collect(new Tuple2<>(token, 1));
}
}
}
}
}
nc -lk 9999
কমান্ডটি রান করুন (যাতে আপনার socket input পাওয়া যায়)।StreamExecutionEnvironment
Flink এর স্ট্রিম প্রসেসিংয়ের execution environment তৈরি করে।DataStream
হিসেবে save করা হয়।flatMap
function ব্যবহার করে প্রতিটি লাইনের word গুলো আলাদা করে এবং তাদের একটি টুপল (word, 1)
আকারে return করে।এই উদাহরণটি আপনাকে Flink DataStream এর একটি সাধারণ ধারণা দেবে।